/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.eam.persitencia.dao.implementacion;

import co.edu.eam.persitencia.dao.Interfaz.IDAOConsulta;
import co.edu.eam.persitencia.entidades.Consulta;
import co.edu.eam.persitencia.entidades.DetalleFormulaMedica;
import co.edu.eam.persitencia.entidades.DetalleOrdenMedica;
import co.edu.eam.persitencia.entidades.FormulaMedica;
import co.edu.eam.persitencia.entidades.OrdenMedica;
import co.edu.eam.persitencia.entidades.Procedimiento;
import co.edu.eam.persitencia.entidades.Remision;
import co.edu.eam.persitencia.enumeraciones.TipoProcedimietoEnum;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Erika
 */
public class DAOConsulta implements IDAOConsulta {

    private EntityManager em;

    /**
     * metodo para conectar a la base de datos
     * @param em EntityManager de la conexion
     */
    public DAOConsulta(EntityManager em) {
        this.em = em;
    }
    
/**
 * metodo que crea un procedimiento en la bd
 * @param procedimiento
 * @throws Exception 
 */
    @Override
    public void crearProcedimiento(Procedimiento procedimiento) throws Exception {
        em.getTransaction().begin();
        em.persist(procedimiento);
        em.getTransaction().commit();
    }
/**
 * metodo para editar un procedimiento en  la bd
 * @param procedimiento
 * @throws Exception 
 */
    @Override
    public void editarProcedimiento(Procedimiento procedimiento) throws Exception {
        em.getTransaction().begin();
        em.merge(procedimiento);
        em.getTransaction().commit();
    }
    /**
     * metodo para buscar un procedimiento en la bd
     * @param id del procedimiento
     * @return un procedimiento
     * @throws Exception 
     */
    @Override
    public Procedimiento buscarProcedimiento(long id)throws Exception{
        return em.find(Procedimiento.class, id);
    }
    /**
     * metodo para eliminar un procedimiento
     * @param procedimiento 
     * @throws Exception 
     */
    @Override
    public void eliminarProcedimiento(Procedimiento procedimiento)throws Exception{
        em.getTransaction().begin();
        em.remove(procedimiento);
        em.getTransaction().commit();
    }
/**
 * metodo para listar todo los procedimientos de la bd
 * @return un list de procedimientos
 * @throws Exception 
 */
    @Override
    public List<Procedimiento> listar() throws Exception {
       Query q=em.createNamedQuery(Procedimiento.CONSULTA_LISTAR_TODO);
       return q.getResultList();
    }
/**
 * metodo para listar las remisiones de una consulta
 * @return un list de remisiones de una consulta
 * @throws Exception 
 */
    @Override
    public List<Remision> listarRemisionConsulta() throws Exception {
        Query q = em.createNamedQuery(Remision.CONSULTA_LISTAR_CONSULTA);
        return q.getResultList();
    }
/**
 * metodo para crear una consulta en la bd
 * @param consulta
 * @throws Exception 
 */
    @Override
    public void crearConsulta(Consulta consulta) throws Exception {
        em.getTransaction().begin();
        em.persist(consulta);
        em.getTransaction().commit();
    }
    /**
     * metodo para buscar una consulta 
     * @param id de la consulta
     * @return una consulta
     * @throws Exception 
     */
    @Override
    public Consulta buscarConsulta(long id)throws Exception{
        return em.find(Consulta.class, id);
    }
    /**
     * metodo para eliminar una consulta
     * @param consulta
     * @throws Exception 
     */
    @Override
    public void eliminarConsulta(Consulta consulta)throws Exception{
        em.getTransaction().begin();
        em.remove(consulta);
        em.getTransaction().commit();
    }
    /**
     * metodo para crear una formla medica
     * @param formulaMedica
     * @throws Exception 
     */
    @Override
    public void crearFormulaMedica(FormulaMedica formulaMedica)throws Exception{
        em.getTransaction().begin();
        em.persist(formulaMedica);
        em.getTransaction().commit();
    }
    /**
     * metodo para crear a orden medica en la bd
     * @param ordenMedica
     * @throws Exception 
     */
    @Override
    public void crearOrdenMedica(OrdenMedica ordenMedica)throws Exception{
        em.getTransaction().begin();
        em.persist(ordenMedica);
        em.getTransaction().commit();
    }
    /**
     * metodo para listar las formulas medicas de una consulta
     * @return un list de formulas medicas
     * @throws Exception 
     */
    @Override
    public List<FormulaMedica> listarFormulaMedicaConsulta(long id) throws Exception {
        Query q = em.createNamedQuery(FormulaMedica.CONSULTA_LISTAR_CONSULTA);
        q.setParameter(FormulaMedica.PARAMETRO_ID_CONSULTA, id);
        return q.getResultList();
    }
/**
 * metodo para listar las consultas por fecha
 * @param fecha de la consulta
 * @return un list de consultas
 * @throws Exception 
 */
    @Override
    public List<Consulta> listarFecha(Date fecha) throws Exception {
        Query q = em.createNamedQuery(Consulta.CONSULTA_LISTAR_CONSULTA_FECHA);
        q.setParameter(Consulta.PARAMETRO_FECHA_CONSULTA, fecha);
        return q.getResultList();
    }
/**
 * metodo para listar las consultas de un paciente
 * @param documento  del paciente
 * @return un list de consultas
 * @throws Exception 
 */
    @Override
    public List<Consulta> listarConsultaPaciente(String documento) throws Exception {
        Query q = em.createNamedQuery(Consulta.CONSULTA_LISTAR_CONSULTA_PACIENTE);
        q.setParameter(Consulta.PARAMETRO_PACIENTE_CONSULTA, documento);
        return q.getResultList();
    }

    @Override
    public List<DetalleFormulaMedica> listarDetalleFormulamedica() throws Exception {
        Query q = em.createNamedQuery(DetalleFormulaMedica.CONSULTA_LISTAR_DETALLEFORMULAMEDICA);
        return q.getResultList();
    }

    @Override
    public List<DetalleOrdenMedica> listarDetalleOrdenMeica() throws Exception {
        Query q = em.createNamedQuery(DetalleOrdenMedica.CONSULTA_LISTAR_DETALLEORDENMEDICA);
        return q.getResultList();
    }

    @Override
    public List<OrdenMedica> listarOrdenMedicaConsulta(long id) throws Exception {
        Query q = em.createNamedQuery(OrdenMedica.CONSULTA_LISTARORDENMEDICA_CONSULTA);
        q.setParameter(OrdenMedica.PARAMETRO_ID_CONSULTA, id);
        return q.getResultList();
    }

    @Override
    public void editarConsulta(Consulta consulta) throws Exception {
        em.getTransaction().begin();
        em.merge(consulta);
        em.getTransaction().commit();
    }
    
    @Override
    public OrdenMedica buscarOrdenMedica(long id)throws Exception{
        return em.find(OrdenMedica.class, id);
    }
    
    @Override
    public FormulaMedica buscarFormulaMedica(long id)throws Exception{
        return em.find(FormulaMedica.class, id);
    }
    
    @Override
    public Remision buscarRemision(long id)throws Exception{
        return em.find(Remision.class, id);
    }
    
    @Override
    public void crearRemision(Remision remision)throws Exception{
        em.getTransaction().begin();
        em.persist(remision);
        em.getTransaction().commit();
    }
    
    @Override
    public DetalleFormulaMedica buscarDetalleFormulaMedica(long id)throws Exception{
        return em.find(DetalleFormulaMedica.class, id);
    }
    
    @Override
    public void crearDetalleFormulaMedica(DetalleFormulaMedica detalle)throws Exception{
        em.getTransaction().begin();
        em.persist(detalle);
        em.getTransaction().commit();
    }
    
    @Override
    public List<Consulta> listarConsultasProcedimiento(TipoProcedimietoEnum tipo)throws Exception{
         Query q = em.createNamedQuery(Consulta.CONSULTA_LISTAR_PROCEDIMIENTO);
        q.setParameter(Consulta.PARAMETRO_ID_PROCEDIMIENTO, tipo);
        return q.getResultList();
    }
    
    @Override
    public List<Remision> listarRemisionesEspecialidades(long id)throws Exception{
         Query q = em.createNamedQuery(Remision.CONSULTA_LISTAR__REMISIONES_ESPECIALIDAD);
        q.setParameter(Remision.PARAMETRO_ID_ESPECIALIDAD, id);
        return q.getResultList();
    }
}
